package razas;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import logica.ModeloEjecucion;
import unidades.UnidadHT;

/**
 * Clase abstracta que es superclase de cualquier raza que se quiera crear
 *
 * @author Ibai
 */
public class Raza {

    private HashMap<String, UnidadHT> lideres;
    private HashMap<String, UnidadHT> unidades;
    private String nombre;
    private static HashMap<String, Raza> razas;
    
    /**
     * Devuelve la raza con el nombre que se pasa por parámetro
     * 
     * @param nombre El nombre de la raza
     * @return La raza solicitada o null si no existe
     */
    public static Raza getRaza(String nombre) {
        return razas.get(nombre);
    }
    
    /**
     * Establece todas las razas disponibles
     * 
     * @param r Todas las razas disponibles identificadas por su nombre
     */
    public static void setRazas(HashMap<String, Raza> r) {
        razas = r;
    }
    
    /**
     * Devuelve los nombres de todas las razas existentes
     * 
     * @return Una coleccion con todas las razas existentes
     */
    public static Collection<String> getRazas() {
        return razas.keySet();
    }
    
    /**
     * Devuelve los objetos de todas las razas existentes
     * 
     * @return Una coleccion con todas las razas existentes
     */ 
    public static Collection<Raza> getRazasObjects() {
        return razas.values();
    }

    /**
     * Constructor que crea una raza sin unidades
     */
    public Raza(String nombre) {
        lideres = new HashMap<String, UnidadHT>();
        unidades = new HashMap<String, UnidadHT>();
        this.nombre = nombre;
    }
    
    /**
     * Devuelve el nombre de esta raza
     * 
     * @return El nombre de la raza
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Devuelve una colección que contiene todos los líderes de esta raza
     *
     * @return Todos los líderes de esta raza
     */
    public Collection<UnidadHT> getLideres() {
        return lideres.values();
    }

    /**
     * Establece los líderes de esta raza
     * 
     * @param lideres Todos los líderes de la raza
     */
    public void setLideres(Collection<UnidadHT> lideres) {
        this.lideres.clear();
        for(UnidadHT u : lideres) {
            this.lideres.put(u.getClass().getSimpleName(), u);
        }
    }

    /**
     * Devuelve una colección que contiene todas las unidades de esta raza
     *
     * @return Todas las unidades no líderes de esta raza
     */
    public Collection<UnidadHT> getUnidades() {
        return unidades.values();
    }

    /**
     * Establece las unidades para esta raza
     *
     * @param unidades Todas las unidades no líderes de la raza
     */
    public void setUnidades(Collection<UnidadHT> unidades) {
        this.unidades.clear();
        for(UnidadHT u : unidades) {
            this.unidades.put(u.getClass().getSimpleName(), u);
        }
    }

    /**
     * Devuelve la unidad con un nombre concreto
     *
     * @param nombre El nombre de la clase de la unidad que se quiere obtener
     * @return Una instancia de la unidad cuya clase tiene el nombre <code>nombre</code>
     * ¡Atención! Se devolverá siempre la misma instancia
     */
    public UnidadHT getUnidad(String nombre) {
        UnidadHT u = lideres.get(nombre);
        if(u != null) {
            return u;
        }
        u = unidades.get(nombre);
        if(u != null) {
            return u;
        }
        throw new IllegalArgumentException("No existe ninguna unidad con nombre " + nombre);
    }
    
    /**
     * Devuelve la URL que apunta a la imagen de esta raza
     *
     * @param ext La extension de la imagen (.png, .gif...)
     * @return La URL de la imagen
     */
    public URL getImage(String ext) throws MalformedURLException {
        return new File(ModeloEjecucion.getPathAProyecto() + "/Modulos/HeroTactics/Unidades/" + nombre + "/" + nombre + ext).toURI().toURL();
    }
    
    /**
     * Lo mismo que getNombre
     * 
     * @return El nombre de la raza
     */
    @Override
    public String toString() {
        return getNombre();
    }
}
